#include <iostream>
#include <vector>

using namespace std;

/*
    1.C语言存放大量类型相同元素->数组、指针申请堆空间
        需要考虑容量、不要越界
    2.C++标准模板库提供的容器都是模板类
    3.vector：矢量，向量容器
        本质是一个动态数组，会自动调整内存分配大小


*/

int main()
{
    // 创建vector对象存放int类型
    vector<int> v1;
    // push_back()尾插存放数据
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    // 遍历打印容器中的数据
    // 写法一：传统的for循环 size()获取容器中元素的个数   v1.at(i)和v1[i]相同
    for (int i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << endl;
    }
    // 写法二：C++11新增的基于范围的for循环
    cout << "==================================================" << endl;
    for (int x : v1)
    {
        cout << x << endl;
    }
    // 写法三：迭代器   end()指向容器的超尾位置（末尾位置的后一个）
    cout << "==================================================" << endl;
    // 定义迭代器对象，指向容器的起始位置
    vector<int>::iterator it = v1.begin();
    for (; it != v1.end(); it++)
    {
        *it += 3;
        cout << *it << endl;
    }

    cout << "=====================assign========================" << endl;
    vector<int> v3;
    v3.assign(3, 100);               // 重新分配向量，将v3容器赋值为3个100
    v3.assign(v1.begin(), v1.end()); // 重新分配向量，将v1容器赋给v3
    for (int x : v3)
    {
        cout << x << endl;
    }

    cout << "=====================back========================" << endl;
    cout << v1.back() << endl; // 返回容器的末尾位置

    cout << "=====================clear========================" << endl;
    v1.clear(); // 清空容器的元素
    for (int x : v1)
    {
        cout << x << endl;
    }

    cout << "=====================data=========================" << endl;
    int *p = v3.data(); // 返回指向容器的首元素的指针
    *p += 100;
    cout << *p << endl;

    cout << "=====================emplace=========================" << endl;
    v3.emplace(v3.begin(), 100); // 在v3.begin()位置插入100
    for (int x : v3)
    {
        cout << x << endl;
    }
    cout << "=====================emplace_back=========================" << endl;
    v3.emplace_back(100); // 在v3的末尾位置插入100
    for (int x : v3)
    {
        cout << x << endl;
    }

    cout << "=====================empty=========================" << endl;
    cout << v3.empty() << endl; //判断容器是否为空
    cout << v1.empty() << endl;

    cout << "=====================erase=========================" << endl;
    v3.erase(v3.begin(),v3.begin()+2); // 删除[v3.begin(),v3.begin()+2)范围的元素
    for (int x : v3)
    {
        cout << x << endl;
    }
    cout << "=====================insert=========================" << endl;
    // v3.insert(v3.begin(),100); // 在v3.begin()位置的前面插入100
    // for (int x : v3)
    // {
    //     cout << x << endl;
    // }
    
    // v3.insert(v3.begin(),2,100); // 在v3.begin()位置的前面插入2个100
    // for (int x : v3)
    // {
    //     cout << x << endl;
    // }
    v1.insert(v1.begin(),v3.begin(),v3.end()); // 在v1.begin()位置的前面插入v3.begin()到v3.end()-1范围的元素
    for (int x : v1)
    {
        cout << x << endl;
    }

    cout << "=====================swap=========================" << endl;
    v1.swap(v3); // 交换v1和v3的元素

    return 0;
}